/**
* Copyright© 2025 ZengFanyu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef CQUPT_H
#define CQUPT_H

#include <inttypes.h>

#define CQUPT_VERSION 1 /*!< CQUPT协议版本号 */

#define CQUPT_PORT 40065 /*!< CQUPT协议默认端口号 */
#define CQUPT_MAX_PAYLOAD_SIZE 1024 /*!< CQUPT协议最大负载大小 */
#define CQUPT_HEADER_SIZE sizeof(cqupt_header_t) /*!< CQUPT协议头部大小 */
#define CQUPT_MAX_MESSAGE_SIZE (CQUPT_HEADER_SIZE + CQUPT_MAX_PAYLOAD_SIZE) /*!< CQUPT协议最大消息大小 */

// CQUPT协议请求头类型定义
#define CQUPT_ACK_SUCCESS 0x00 /*!< 成功响应 */
#define CQUPT_CMD_UPLOAD 0x01 /*!< 上传命令 */
#define CQUPT_CMD_UPLOAD_END 0x02 /*!< 上传结束 */
#define CQUPT_CMD_DOWNLOAD 0x03 /*!< 下载命令 */
#define CQUPT_CMD_DOWNLOAD_END 0x04 /*!< 下载结束 */
#define CQUPT_ACK_FAILURE 0xff /*!< 失败响应 */

// CQUPT协议错误码定义
#define CQUPT_ERROR_INVALID_HEADER -1 /*!< 无效的头部 */
#define CQUPT_ERROR_CHECKSUM_MISMATCH -2 /*!< 校验和不匹配 */
#define CQUPT_ERROR_INVALID_VERSION -3 /*!< 无效的版本 */
#define CQUPT_ERROR_UNSUPPORTED_TYPE -4 /*!< 不支持的消息类型 */
#define CQUPT_ERROR_INVALID_LENGTH -5 /*!< 消息长度非正数*/
#define CQUPT_ERROR_INVALID_PARAM -6 /*!< 无效的参数 */

typedef enum CQUPT_Header_Type {
    CQUPT_HEADER_TYPE_ACK_SUCCESS = 0x00, /*!< 成功响应 */
    CQUPT_HEADER_TYPE_CMD_UPLOAD = 0x01, /*!< 上传命令 */
    CQUPT_HEADER_TYPE_CMD_UPLOAD_END = 0x02, /*!< 上传结束 */
    CQUPT_HEADER_TYPE_CMD_DOWNLOAD = 0x03, /*!< 下载命令 */
    CQUPT_HEADER_TYPE_CMD_DOWNLOAD_END = 0x04, /*!< 下载结束 */
    CQUPT_HEADER_TYPE_ACK_FAILURE = 0xff /*!< 失败响应 */
}cqupt_header_type;

typedef struct CQUPT_Header {
    uint8_t version; /*!< CQUPT协议版本 */
    cqupt_header_type type; /*!< 消息类型 */
    uint32_t length; /*!< 消息长度 */
    uint64_t checksum; /*!< 校验和 */
} cqupt_header_t;

typedef struct CQUPT_Message {
    cqupt_header_t header; /*!< 消息头部 */
    uint8_t payload[CQUPT_MAX_PAYLOAD_SIZE]; /*!< 消息负载 */
} cqupt_message_t;

/**
 * 计算校验和
 * @param data 指向数据的指针
 * @param length 数据的长度
 * @return 校验和
 */
uint32_t cqupt_calculate_checksum(const void* data, size_t length);

/**
 * @brief 检验CQUPT请求头的有效性，包括版本号、长度和类型等。
 * @details 1. 检验参数是否为NULL 2. 检验版本号是否匹配 3. 检验长度是否为正数 4. 检验类型是否为上传或下载
 * @note 目前未实现校验和的校验，后续可以添加
 * @param header 指向CQUPT请求头的指针
 * @return 校验结果, 0代表有效
 */
int cqupt_validate_header(const cqupt_header_t* header);

/**
 * 响应请求头
 * @param sockfd socket连接
 * @param buffer 接收缓存区
 * @return 请求的类型
 */
int cqupt_receive_response(int sockfd, char *buffer);


#endif //CQUPT_H
